package com.mixsmart.core.xml.sqlmap;

import java.util.List;

import com.mixsmart.core.IMixSmart;
import com.mixsmart.core.bean.ProjectInfo;
import com.mixsmart.core.config.SystemConfig;
import com.mixsmart.core.xml.sqlmap.bean.SQLMapFile;
import com.mixsmart.core.xml.sqlmap.bean.SqlUnit;
import com.mixsmart.utils.CollectionUtils;
import com.mixsmart.utils.StringUtils;

/**
 * 初始化sqlmap的XML文件内容；
 * 该类为单例模式（即系统中只有一个实例）
 * @author lmq
 * @version 1.0
 * @since JDK版本大于等于1.6
 * 2016年1月21日
 */
public class InitSqlMap {

	private List<SQLMapFile> sqlMapFiles;
	
	private SqlMapParser sqlMapParser;
	
	private static InitSqlMap instance;
	
	/**
	 * 私有构造函数；
	 * 避免从外部类中通过new方式创建该对象实例
	 * @param xmlPath SQL配置文件路径
	 */
	private InitSqlMap(String xmlPath) {
		sqlMapParser = new SqlMapParser(xmlPath);
		sqlMapFiles = sqlMapParser.parser();
	}
	
	/**
	 * 获取InitSqlMap实例
	 * @param xmlPath SQL配置文件路径
	 * @return 返回InitSqlMap
	 */
	public synchronized static InitSqlMap getInstance(String xmlPath) {
		if(null == instance) {
			instance = new InitSqlMap(xmlPath);
		}
		return instance;
	}
	
	/**
	 * 获取SQL信息
	 * @param name SQL名称
	 * @return 返回SQL信息
	 */
	public SqlUnit getSql(String name) {
		SqlUnit sqlUnit = null;
		ProjectInfo projectInfo = SystemConfig.getInstance().getProjectInfo();
		//如果是开发者模式，则检查SQL配置文件是否修改过，如果修改过则重新加载
		if(IMixSmart.PROJECT_DEV_MODEL.equals(projectInfo.getDevModel())) {
			sqlMapParser.reloadModifySqlMap();
		}
		if(StringUtils.isNotEmpty(name) && 
				CollectionUtils.isNotEmpty(sqlMapFiles) && !sqlMapFiles.isEmpty()) {
			for (SQLMapFile sqlMapFile : sqlMapFiles) {
				if(null != sqlMapFile.getSqlMaps() && !sqlMapFile.getSqlMaps().isEmpty()) {
					sqlUnit = sqlMapFile.getSqlMaps().get(name);
					if(null != sqlUnit) break;
				}
			}
		}
		return sqlUnit;
	}
	
	/**
	 * 获取SQL信息；根据SQL名称加命名空间名称
	 * @param name SQL名称
	 * @param namespaces 命名空间
	 * @return 返回SQL信息
	 */
	public SqlUnit getSqlByNamespaces(String name, String namespaces) {
		SqlUnit sqlUnit = null;
		ProjectInfo projectInfo = SystemConfig.getInstance().getProjectInfo();
		//如果是开发者模式，则检查SQL配置文件是否修改过，如果修改过则重新加载
		if(IMixSmart.PROJECT_DEV_MODEL.equals(projectInfo.getDevModel())) {
			sqlMapParser.reloadModifySqlMap();
		}
		if(StringUtils.isNotEmpty(name) && 
				CollectionUtils.isNotEmpty(sqlMapFiles) && !sqlMapFiles.isEmpty()) {
			for (SQLMapFile sqlMapFile : sqlMapFiles) {
				if(sqlMapFile.getNamespaces().equals(namespaces)) {
					if(null != sqlMapFile.getSqlMaps() && !sqlMapFile.getSqlMaps().isEmpty()) {
						sqlUnit = sqlMapFile.getSqlMaps().get(name);
						if(null != sqlUnit) break;
					} else {
						break;
					}
				}
			}//for
		}
		return sqlUnit;
	}
}
